#include <iostream>
#include <sstream>
#include "Rala.h"

using namespace std;

void porCopia(Rala<int> r);

void porCopia(Rala<int> r)
{
    r.asignar(5,5,999);

    assert(r.leer(5,5) == 999);
}

int main()
{
    // testeamos constructor
    Rala<int> matriz(10, 10, 3);
    assert(matriz.filas() == 10);
    assert(matriz.columnas() == 10);

    Rala<int> matriz2(12, 31, 3);
    assert(matriz2.filas() == 12);
    assert(matriz2.columnas() == 31);

    // asignar y leer
    matriz.asignar(1,2,222);
    assert(matriz.leer(1,2) == 222);
    assert(matriz.leer(5,5) == 3);

    // testeamos asignar, leer y constructor por copia
    matriz.asignar(5,5,123);
    porCopia(matriz);
    assert(matriz.leer(1,2) == 222);
    assert(matriz.leer(5,5) == 123);
    porCopia(matriz);
    assert(matriz.leer(7,2) == 3);

    // testeamos cant no default
    assert(matriz.cantNoDefault() == 2);

    // testeamos cout
    cout << matriz << endl;
    cout << "lalala: " << matriz << endl;

    /*
     testeamos operador de asignaci�n
     es medio con magia
    */
   stringstream m1, m2;
    string m1s, m2s;
    m1 << matriz;
    m1s = m1.str();
    m2 << matriz2;
    m2s = m2.str();

    Rala<int> swap(1,1,1);
    swap = matriz;
    matriz = matriz2;
    matriz2 = swap;

    stringstream m1prima, m2prima;
    string m1sprima, m2sprima;
    m1prima << matriz;
    m1sprima = m1prima.str();
    m2prima << matriz2;
    m2sprima = m2prima.str();

    assert(m1s == m2sprima);
    assert(m2s == m1sprima);

    // operator ==
    assert(swap == matriz2);
    assert(matriz2 == swap);
    assert(matriz != matriz2);
    assert(matriz2 != matriz);

    // construimos cosas raras
    Rala<string> raro3(8,9,m1s);

    return 0;
}
